package com.ljf.framework.filter;

import com.ljf.framework.exception.LjfException;
import com.ljf.framework.router.LjfRouterManager;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 说明：客制化应用的filter可以实现改类，并重写
 * initLjfFilter方法
 * 可在该方法中初始化需要的filter：如 Ssofilter
 * <p>
 * 最后执行doLjfFilter方法可以执行所有配置的filter规则
 *
 * @Auther: lijinfeng
 * @Date: 2024/4/23
 */
public abstract class LjfAbstractFilter implements LjfFilter {
    /**
     * 执行顺序
     */
    private Integer order;


    // ------------------------ 设置此过滤器 拦截 & 放行 的路由

    /**
     * 拦截路由
     */
    private List<String> includeList = new ArrayList<>();

    /**
     * 放行路由
     */
    private List<String> excludeList = new ArrayList<>();

    /**
     * 获取 [拦截路由] 集合
     *
     * @return see note
     */
    @Override
    public List<String> getIncludeList() {
        return includeList;
    }

    /**
     * 获取 [放行路由] 集合
     *
     * @return see note
     */
    @Override
    public List<String> getExcludeList() {
        return excludeList;
    }

    // ------------------------ 钩子函数

    /**
     * 前置函数：在每次[认证函数]之前执行
     */
    public LjfFilterAuthStrategy beforeAuth = r -> true;
    /**
     * 认证函数：每次请求执行
     */
    public LjfFilterAuthStrategy authStrategy = r -> true;

    /**
     * 异常处理函数：每次[认证函数]发生异常时执行此函数
     */
    public LjfFilterErrorStrategy errorStrategy = e -> {
        throw new LjfException(e.getMessage());
    };

    @Override
    public LjfFilterAuthStrategy getBeforeAuthStrategy() {
        return beforeAuth;
    }

    public void setBeforeAuth(LjfFilterAuthStrategy beforeAuth) {
        this.beforeAuth = beforeAuth;
    }

    @Override
    public LjfFilterAuthStrategy getAuthStrategy() {
        return authStrategy;
    }

    public void setAuthStrategy(LjfFilterAuthStrategy authStrategy) {
        this.authStrategy = authStrategy;
    }

    @Override
    public LjfFilterErrorStrategy getErrorStrategy() {
        return errorStrategy;
    }

    /**
     * 自有框架个性扩展方法
     *
     * @return false 表示停止继续执行ljfFilter
     */
    public abstract boolean doCusFilter() throws Exception;


}
